package com.example.demo.SinglePattern;

/**
 * @author gyq
 * @description 双重检查锁做到了并发度很好的线程安全，但是，其实这种写法还是有问题的！！
 * 假设线程A执行到了第14行，它判断对象为空，于是线程A执行到第17行去初始化这个对象，但初始化是需要耗费时间的，但是这个对象的地址其实已经存在了。
 * 此时线程B也执行到了第14行，它判断不为空，于是直接跳到21行得到了这个对象。但是，这个对象还没有被完整的初始化！得到一个没有初始化完全的对象有什么用！！
 * 关于这个Double-Checked Lock的讨论有很多，目前公认这是一个Anti-Pattern，不推荐使用！ * 那么有没有什么更好的写法呢？有！
 * 这里又要提出一种新的模式——Initialization on Demand Holder. 这种方法使用内部类来做到延迟加载对象，
 * 在初始化这个内部类的时候，JLS(Java Language Sepcification)会保证这个类的线程安全。
 * 这种写法最大的美在于，完全使用了Java虚拟机的机制进行同步保证，没有一个同步的关键字。
 * @datetime 2019/2/23 19:59
 */
public class SinglePattern {
    private static class SinglePatternsHolder {
        public final static SinglePattern singlePatterns = new SinglePattern();
    }

    public static SinglePattern getInstance() {
        return SinglePatternsHolder.singlePatterns;
    }
}
